package com.gitee.qdbp.jdbc.stream;

import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.RowMapper;
import com.gitee.qdbp.able.jdbc.paging.Paging;
import com.gitee.qdbp.jdbc.api.SqlDao;
import com.gitee.qdbp.jdbc.sql.SqlBuffer;

/**
 * 设置参数的后续操作: find|list|insert|update|delete / pageBy / resultAs<br>
 *
 * @author zhaohuihua
 * @version 20210530
 */
public class SqlOnAfterParamsStream {

    protected final SqlDao dao;
    protected final String sqlId;
    protected final Object params;

    SqlOnAfterParamsStream(SqlDao dao, String sqlId, Object params) {
        this.dao = dao;
        this.sqlId = sqlId;
        this.params = params;
    }

    public SqlBuffer getContent() {
        return this.dao.getSqlContent(sqlId, params);
    }

    /**
     * 查询数据, 结果为Map结构<br>
     * <pre>
    Map&lt;String, Object&gt; user = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .find();
     * </pre>
     * 
     * @return Map结果
     */
    public Map<String, Object> find() {
        return this.dao.findForMap(sqlId, params);
    }

    /**
     * 查询数据列表, 结果为Map列表<br>
     * <pre>
    List&lt;Map&lt;String, Object&gt;&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .list();
     * </pre>
     * 
     * @return Map列表
     */
    public List<Map<String, Object>> list() {
        return this.dao.listForMaps(sqlId, params);
    }

    /**
     * 执行插入语句
     * 
     * @return 影响行数
     */
    public int insert() {
        return this.dao.insert(sqlId, params);
    }

    /**
     * 执行更新语句
     * 
     * @return 影响行数
     */
    public int update() {
        return this.dao.update(sqlId, params);
    }

    /**
     * 执行删除语句
     * 
     * @return 影响行数
     */
    public int delete() {
        return this.dao.delete(sqlId, params);
    }

    /**
     * 设置结果实体类型<br>
     * <pre>
    List&lt;SysUser&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .resultAs(SysUser.class)
        .list();
     * </pre>
     * 
     * @param <T> 实体类型
     * @param resultType 实体类
     * @return 返回后续流式操作对象
     */
    public <T> SqlOnResultTypeStream<T> resultAs(Class<T> resultType) {
        return new SqlOnResultTypeStream<>(dao, sqlId, params, resultType);
    }

    /**
     * 设置结果实体类型
     * 
     * @param <T> 实体类型
     * @param rowMapper 结果转换类
     * @return 返回后续流式操作对象
     */
    public <T> SqlOnResultTypeStream<T> resultAs(RowMapper<T> rowMapper) {
        return new SqlOnResultTypeStream<>(dao, sqlId, params, rowMapper);
    }

    /**
     * 根据条件分页查询实体列表<br>
     * <pre>
    List&lt;Map&lt;String, Object&gt;&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .pageBy(1, 10) // 查第1页,每页10行
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
     * </pre>
     * 
     * @param pageIndex 第几页
     * @param pageSize 每页行数
     * @return 返回后续流式操作对象
     */
    public SqlOnAfterPagingStream pageBy(int pageIndex, int pageSize) {
        return pageBy(new Paging(pageIndex, pageSize));
    }

    /**
     * 根据条件分页查询实体列表<br>
     * <pre>
    List&lt;Map&lt;String, Object&gt;&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .pageBy(1, 10, 88) // 查第1页,每页10行, 88=提前查询的总行数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
     * </pre>
     * 
     * @param pageIndex 第几页
     * @param pageSize 每页行数
     * @param total 总行数(用于提前查询总行数的情况)
     * @return 返回后续流式操作对象
     */
    public SqlOnAfterPagingStream pageBy(int pageIndex, int pageSize, int total) {
        return pageBy(new Paging(pageIndex, pageSize, total));
    }

    /**
     * 根据条件分页查询实体列表<br>
     * <pre>
    List&lt;Map&lt;String, Object&gt;&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .pageBy(1, 10, false) // 查第1页,每页10行, false=无需统计总数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
     * </pre>
     * 
     * @param pageIndex 第几页
     * @param pageSize 每页行数
     * @param needCount 是否统计总数
     * @return 返回后续流式操作对象
     */
    public SqlOnAfterPagingStream pageBy(int pageIndex, int pageSize, boolean needCount) {
        return pageBy(new Paging(pageIndex, pageSize, needCount));
    }

    /**
     * 根据条件分页查询实体列表<br>
     * <pre>
    List&lt;Map&lt;String, Object&gt;&gt; users = qdbcBoot.sqlStream()
        .sqlId("SysUserMapper:queryRoleUsers")
        .params(map)
        .pageBy(new Paging(1,10,false)) // 查第1页,每页10行, false=无需统计总数
        .list().asPartList(); // 分页后返回的是PageList, 需要转换为普通List
     * </pre>
     * 
     * @param paging 分页参数
     * @return 返回后续流式操作对象
     */
    public SqlOnAfterPagingStream pageBy(Paging paging) {
        return new SqlOnAfterPagingStream(dao, sqlId, params, paging);
    }
}
